import sys, socket, struct, time

# 定义要获取时间的服务器主机名
# hostname = 'time.nist.gov'
# 定义时间服务器使用的端口号，NTP 时间协议通常使用 37 端口
port = 51423

# 通过主机名获取对应的 IP 地址
# host = socket.gethostbyname(hostname)
host = '127.0.0.1'

# 创建一个 UDP 套接字，socket.AF_INET 表示使用 IPv4 地址族，socket.SOCK_DGRAM 表示使用 UDP 协议
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 向时间服务器发送一个空白字节数据，请求时间信息
s.sendto(' '.encode('utf-8'), (host, port))

# 提示用户程序正在等待服务器的回复，按 Ctrl-C 或 Ctrl-Break 可停止
print('Looking for replies; press Ctrl-C or Ctrl-Break to stop')

# 从套接字接收最多 2048 字节的数据，并只取数据部分（忽略地址信息）
buf = s.recvfrom(2048)[0]

# 检查接收到的数据长度是否为 4 字节，NTP 时间服务器返回的时间戳通常为 4 字节
if len(buf) != 4:
    # 若长度不对，打印错误信息，包含接收到的数据长度和数据内容
    print('Wrong-sized reply %d: %s' % (len(buf), buf))
    # 退出程序并返回错误码 1
    sys.exit(1)

# 使用 struct 模块将接收到的 4 字节数据按网络字节序（大端字节序）解包为无符号整数
secs = struct.unpack('!I', buf)[0]

# NTP 时间戳从 1900 年 1 月 1 日开始计数，而 Python 的时间戳从 1970 年 1 月 1 日开始计数，
# 这里减去两者的时间差（2208988800 秒）
secs -= 2208988800

# 将时间戳转换为本地时间的字符串表示并打印
print(time.ctime(int(secs)))    
